package upc.dew.inscripcionalumnos.controller;


import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.ModelAndView;
import upc.dew.inscripcionalumnos.model.Modalidad;
import upc.dew.inscripcionalumnos.model.Requisito;


/**
 *
 * @author andres
 */
public class AdministradorController extends BaseController
{
    private static final String PARAMETRO_ACCION = "accion";
    private static final String ACCION_REGISTRAR_REQUISITOS = "guardar";
    private static final String ACCION_ELIMINAR = "eliminar";
    private static final String ACCION_LISTAR_REQUISITOS = "listarRequisitos";
    private static final String ACCION_LISTAR_ASIGNACIONES = "listarAsignaciones";
    private static final String ACCION_ASIGNAR = "asignar";
    private static final String ACCION_VER_REQUISITOS_MODALIDAD = "verRequisitosModalidad";
    private static final String ACCION_VER_REQUISITOS = "verRequisitos";
    
    @Override
    protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception
    {
        Map<String, Object> model = new HashMap<String,Object>();

        if(esAccionRegistrarRequisitos(request))
        {
            return registrarRequisitos(request,response);
        }
        else if(esAccionEliminar(request))
        {
           return eliminarRequisitos(request,response);
        }
        else if(esAccionListarRequisitos(request))
        {
           return listarRequisitos(request,response);
        }
        else if(esAccionListarAsignaciones(request))
        {
           return listarAsignaciones(request,response);
        }
        else if(esAccionAsignar(request))
        {
           return asignarRequisitos(request,response);
        }
        else if(esAccionVerRequisitosModalidad(request))
        {
           return verRequisitosModalidad(request,response);
        }
        else if(esAccionVerRequisitos(request))
        {
           return verRequisitos(request,response);
        }
        else
        {
           return listarRequisitos(request,response);
        }
    }

    private ModelAndView registrarRequisitos(HttpServletRequest request, HttpServletResponse response)
    {

        Map<String, Object> model = new HashMap<String,Object>();
        Requisito requisito = new Requisito();
        requisito.setNombre(request.getParameter("nombre"));
        requisito.setDescripcion(request.getParameter("descripcion"));
        requisito.setPrioridad(request.getParameter("prioridad"));

        getAdministradorService().registrarRequisito(requisito);
        List<Requisito> requisitos = (List<Requisito>) getAdministradorService().obtenerRequisitos();
        model.put("requisitos", requisitos);

        return new ModelAndView("Registro_Requisitos", model);
    }

    private ModelAndView asignarRequisitos(HttpServletRequest request, HttpServletResponse response)
    {
        Map<String, Object> model = new HashMap<String,Object>();
        String [] codigoRequisitos = request.getParameterValues("asignar");

        getAdministradorService().eliminarModalidad(request.getParameter("modalidad") );

        for (int i = 0; i < codigoRequisitos.length; i++) {
            getAdministradorService().insertarRequisitos( request.getParameter("modalidad"), codigoRequisitos[i]);
        }

        List<Requisito> requisitos = (List<Requisito>) getAdministradorService().obtenerRequisitos();
        model.put("requisitos", requisitos);
        model.put("modalidades", getCatalogoService().obtenerModalidades());
        
        return new ModelAndView("Asignar_Requisitos", model);
    }
    
    private ModelAndView listarRequisitos(HttpServletRequest request, HttpServletResponse response)
    {

       
        Map<String, Object> model = new HashMap<String,Object>();
        List<Requisito> requisitos = (List<Requisito>) getAdministradorService().obtenerRequisitos();
        model.put("requisitos", requisitos);
        request.removeAttribute("accion");
  
        return new ModelAndView("Registro_Requisitos", model);
    }

    private ModelAndView listarAsignaciones(HttpServletRequest request, HttpServletResponse response)
    {
        Map<String, Object> model = new HashMap<String,Object>();
        List<Requisito> requisitos = (List<Requisito>) getAdministradorService().obtenerRequisitos();
        model.put("modalidades", getCatalogoService().obtenerModalidades());
        model.put("requisitos", requisitos);

        return new ModelAndView("Asignar_Requisitos", model);
    }

    private ModelAndView eliminarRequisitos(HttpServletRequest request, HttpServletResponse response)
    {
        Map<String, Object> model = new HashMap<String,Object>();
        Integer codigo = Integer.parseInt(request.getParameter("codigo"));

        /** Se eliminan los requisitos en el caso de que se encuentren asignados **/
        getAdministradorService().eliminarRequisitoModalidad(codigo);

        /** se eliminan los requisitos de la tabla de requisitos**/
        getAdministradorService().eliminarRequisito(codigo);
        
        List<Requisito> requisitos = (List<Requisito>) getAdministradorService().obtenerRequisitos();
        request.getSession().setAttribute("requisitos", requisitos);
        model.put("requisitos", requisitos);
        
        return new ModelAndView("Registro_Requisitos", model);
    }

    private ModelAndView verRequisitosModalidad(HttpServletRequest request, HttpServletResponse response) {

        Map<String, Object> model = new HashMap<String,Object>();
        List<Modalidad> modalidades = getCatalogoService().obtenerModalidades();
        model.put("modalidades", modalidades);
        return new ModelAndView("administrador_requisitos_modalidad", model);
    }


    private ModelAndView verRequisitos(HttpServletRequest request, HttpServletResponse response)
    {
        Map<String, Object> model = new HashMap<String,Object>();
        Integer codigoModalidad = Integer.parseInt(request.getParameter("modalidad"));
        List<Requisito> requisitos = getCatalogoService().obtenerRequisitosPorModalidad(codigoModalidad);
        List<Modalidad> modalidades = getCatalogoService().obtenerModalidades();
        model.put("modalidades", modalidades);
        model.put("requisitos", requisitos );
        return new ModelAndView("administrador_requisitos_modalidad", model);
    }


    private boolean esAccionRegistrarRequisitos(HttpServletRequest request)
    {
    	return ACCION_REGISTRAR_REQUISITOS.equals(request.getParameter(PARAMETRO_ACCION));
    }

    private boolean esAccionEliminar(HttpServletRequest request)
    {
    	return ACCION_ELIMINAR.equals(request.getParameter(PARAMETRO_ACCION));
    }

    private boolean esAccionListarRequisitos(HttpServletRequest request)
    {
    	return ACCION_LISTAR_REQUISITOS.equals(request.getParameter(PARAMETRO_ACCION));
    }

    private boolean esAccionListarAsignaciones(HttpServletRequest request)
    {
    	return ACCION_LISTAR_ASIGNACIONES.equals(request.getParameter(PARAMETRO_ACCION));
    }
    
    private boolean esAccionAsignar(HttpServletRequest request)
    {
    	return ACCION_ASIGNAR.equals(request.getParameter(PARAMETRO_ACCION));
    }
    private boolean esAccionVerRequisitosModalidad(HttpServletRequest request)
    {
    	return ACCION_VER_REQUISITOS_MODALIDAD.equals(request.getParameter(PARAMETRO_ACCION));
    }
    private boolean esAccionVerRequisitos(HttpServletRequest request)
    {
    	return ACCION_VER_REQUISITOS.equals(request.getParameter(PARAMETRO_ACCION));
    }

}
